4. 컨테이너와 레이아웃 관리자(Layout Manager) :: AWT스윙GUI[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

AWT스윙GUI
[1]
등록일:2008-03-12 16:51:51 (0%)
작성자:
제목:4. 컨테이너와 레이아웃 관리자(Layout Manager)
가.  컨테이너  내에서의  컴포넌트의  레이아웃  

모든  컨테이너는  기본적으로  디폴트  레이아웃  관리자를  가지고  있고,  이러한  레이아웃  관리자는  LayoutManage  인터페이스를  구현하고  있습니다.  만약,  컨테이너의  디폴트  레이아웃  관리자가  만족스럽지  못하더라고,  컨테이너의  레이아웃  관리자를  쉽게  다른  레이아웃  관리자로  바꿀  수  있습니다.  AWT가  제공해  주는  레이아웃  관리자들에  대해  다음과  같은  몇  가지로  분류할  수  있습니다.  

l                          매우  간단한(very  simple)  레이아웃  관리자:  플로우  레이아웃(FlowLayout),  그리드  레이아웃(GridLayout)
l                          특수  목적(special  purpose)  레이아웃  관리자:  보더  레이아웃(BorderLayout),  카드  레이아웃(CardLayout)
l                          매우  유용한(ultra-flexible)  레이아웃  관리자:  그리드백  레이아웃(GridBagLayout)
  
나.  플로우  레이아웃  관리자(FlowLayout)  

플로우  레이아웃  관리자는  패널  컴포넌트를  위한  디폴트  레이아웃  관리자입니다.  플로우  레이아웃  관리자는  컴포넌트를  레이아웃  할  때,  왼쪽에서  오른쪽으로  그리고  위에서  아래로  차례대로  레이아웃  합니다.  이러한  레이아웃은  텍스트  편집기를  이용하여  텍스트를  입력하는  것과  같이  생각하면  쉽습니다.  다시  말해서,  텍스트  편집기를  이용하여  글자를  입력할  때,  왼쪽에서  오른쪽으로  차례대로  입력하게  되고,  한  줄이  다  차면  다음  줄로  넘어가지요.  이와  마찬가지로,  플로우  레이아웃  관리자도  컴포넌트를  컨테이너의  왼쪽에서  오른쪽으로  하나씩  채워가다가,  오른쪽  끝에  다다르면  다음  줄로  넘어가게  됩니다.  지금까지  AWT  컴포넌트를  살펴볼  때,  알게  모르게  많이  사용했던  레이아웃  관리자입니다.  다음에  나오는  자바  프로그램은  플로우  레이아웃  관리자의  사용을  보여주는  간단한  프로그램입니다.  

import  java.io.*;
import  java.awt.*;

class  FlowLayoutTest  extends  Frame  {
      public  FlowLayoutTest()  {
            Panel  p  =  new  Panel();
            p.add(new  Button("Button  1"));
            p.add(new  Button("Button  2"));
            p.add(new  Button("Button  3"));
            p.add(new  Button("Button  4"));
            p.add(new  Button("Button"),  "Button");  

            Choice  colorChooser  =  new  Choice();
            colorChooser.add("Green");
            colorChooser.add("Red");
            colorChooser.add("Blue");  

            p.add(colorChooser,  "Colors");

            add(p);

      }

  

      public  static  void  main(String  args[])  {
            FlowLayoutTest  f  =  new  FlowLayoutTest();  
            f.pack();
            f.setTitle("FlowLayout");
            f.setVisible(true);
      }

}

  

/*
  *  Results:  

  D:\AIIT\JAVA\Working\08>java  FlowLayoutTest
  D:\AIIT\JAVA\Working\08>
  */

  

<프로그램  15.  FlowLayoutTest.java>

FlowLayout  클래스의  객체  생성자와  주요  메소드를  살펴보면  다음과  같습니다.  

l                          static  int  LEFT:  플로우  레이아웃  관리자의  왼쪽  정렬  값을  나타냅니다.
l                          static  int  CENTER:  플로우  레이아웃  관리자의  가운데  정렬  값을  나타냅니다.
l                          static  int  RIGHT:  플로우  레이아웃  관리자의  오른쪽  정렬  값을  나타냅니다.
l                          static  int  LEADING:  플로우  레이아웃  관리자의  리딩  에지(leading  edge)  정렬  값을  나타냅니다.
l                          static  int  TRAILING:  플로우  레이아웃  관리자의  드레일링  에지(leading  edge)  정렬  값을  나타냅니다.
l                          FlowLayout():  디폴트로  가운데  정렬을  하고,  수평과  수직  간격이  5인  플로우  레이아웃  관리자를  생성합니다.
l                          FlowLayout(int  align):  주어진  정렬을  하고,  수평과  수직  간격이  5인  플로우  레이아웃  관리자를  생성합니다.
l                          FlowLayout(int  align,  int  hgap,  int  vgap):  주어진  정렬을  하고,  수평과  수직  간격이  각각  hgap과  vgap인  플로우  레이아웃  관리자를  생성합니다.
l                          void  addLayoutComponent(String  name,  Component  comp):  주어진  이름으로  컴포넌트를  추가합니다.
l                          void  removeLayoutComponent(Component  comp):  컴포넌트를  제거합니다.
l                          int  getAlignment():  정렬  방식의  값을  얻습니다.
l                          void  setAlignment(int  align):  정렬  방식을  설정합니다.
l                          void  layoutContainer(Container  target):  컨테이너에  대한  레이아웃을  행합니다.
l                          int  getHgap():  수평  간격을  얻습니다.
l                          int  getVgap():  수직  간격을  얻습니다.
l                          void  setHgap(int  hgap):  수평  간격을  설정합니다.
l                          void  setVgap(int  vgap):  수직  간격을  설정합니다.
  
다.  그리드  레이아웃  관리자(GridLayout)  

그리드  레이아웃  관리자는  컨테이너의  영역을  주어진  행과  열  크기의  셀들로  나누고,  동등한  크기의  각  셀에  컴포넌트를  하나씩  위치시키므로,  모든  컴포넌트의  크기는  동일하게  됩니다.  그리드  레이아웃  관리자는  셀  단위의  레이아웃을  수행하고,  이러한  셀을  사각형  그리드(rectangular  grid)라  할  수  있으므로,  그리드  레이아웃  관리자라  하는  것입니다.

다음에  나오는  자바  프로그램은  플로우  레이아웃  관리자의  사용을  보여주는  간단한  프로그램입니다.  

import  java.io.*;
import  java.awt.*;

class  GridLayoutTest  extends  Frame  {
      public  GridLayoutTest()  {
            Panel  p1  =  new  Panel(new  GridLayout());
            p1.add(new  Button("Button  1"));
            p1.add(new  Button("Button  2"));
            p1.add(new  Button("Button  3"));
            p1.add(new  Button("Button  4"));
            p1.add(new  Button("Button"),  "Button");  

            Choice  colorChooser  =  new  Choice();
            colorChooser.add("Green");
            colorChooser.add("Red");
            colorChooser.add("Blue");

            p1.add(colorChooser,  "Colors");  

            Panel  p2  =  new  Panel(new  GridLayout(2,  3));
            p2.add(new  Button("Button  1"));
            p2.add(new  Button("Button  2"));
            p2.add(new  Button("Button  3"));
            p2.add(new  Button("Button  4"));
            p2.add(new  Button("Button"),  "Button");  

            add("North",  p1);
            add("Center",  p2);
      }  

      public  static  void  main(String  args[])  {
            GridLayoutTest  f  =  new  GridLayoutTest();

            f.pack();
            f.setTitle("GridLayout");
            f.setVisible(true);
      }
}

  

/*
  *  Results:
  D:\AIIT\JAVA\Working\08>java  GridLayoutTest
  D:\AIIT\JAVA\Working\08>
  */

<프로그램  16.  GridLayoutTest.java>  

위의  예제에서는  그리드  레이아웃  관리자를  사용하는  두  개의  패널  컴포넌트를  프레임이  포함하도록  하고  있습니다.  이  때,  프레임의  레이아웃  관리자는  윈도우  컴포넌트의  디폴트  레이아웃  관리자인  보더  레이아웃  관리자입니다.  그리고,  첫  번째  패널  컴포넌트는  하나의  행을  갖는  그리드  레이아웃  관리자를  갖고,  두  번째  패널  컴포넌트는  2행  3열을  갖고  수평  간격은  10,  수직  간격은  5인  그리드  레이아웃  관리자를  갖고  있습니다.

GridLayout  클래스의  객체  생성자와  주요  메소드를  살펴보면  다음과  같습니다.  

l                          GridLayout():  단  하나의  행을  갖고  각  컴포넌트는  하나의  열을  차지하도록  레이아웃하는  그리드  레이아웃  관리자를  생성합니다.

l                          GridLayout(int  rows,  int  cols):  주어진  행과  열을  갖는  레이아웃하는  그리드  레이아웃  관리자를  생성합니다.

l                          GridLayout(int  rows,  int  cols,  int  hgap,  int  vgap):  주어진  행과  열을  갖고  수평과  수직  간격이  각각  hgap과  vgap인  그리드  레이아웃  관리자를  생성합니다.  

l                          void  addLayoutComponent(String  name,  Component  comp):  주어진  이름으로  컴포넌트를  추가합니다.

l                          int  getColumns():  열의  크기를  얻습니다.

l                          int  getHgap():  수평  간격을  얻습니다.

l                          int  getRows():  행의  크기를  얻습니다.

l                          int  getVgap():  수직  간격을  얻습니다.

l                          void  layoutContainer(Container  parent):  컨테이너를  레이아웃  합니다.

l                          void  removeLayoutComponent(Component  comp):  주어진  컴포넌트를  제거합니다.

l                          void  setColumns(int  cols):  열의  크기를  설정합니다.

l                          void  setHgap(int  hgap):  수평  간격을  설정합니다.

l                          void  setRows(int  rows):  행의  크기를  설정합니다.

l                          void  setVgap(int  vgap):  수직  간격을  설정합니다.

  
라.  보더  레이아웃  관리자(BorderLayout  )

보더  레이아웃  관리자는  프레임(Frame)  컴포넌트와  대화상자(Dialog)  컴포넌트  등과  같은  모든  윈도우(Window)  컴포넌트를  위한  디폴트  레이아웃  관리자입니다.  보더  레이아웃은  동(east),  서(west),  남(south),  북(north),  그리고  중앙(center)  등  다섯  개의  영역으로  나누어  컴포넌트들을  관리합니다.  이  다섯  개의  영역은  기본적으로  중앙  영역에  위치시키고,  사용자가  나머지  영역(동,  서,  남,  북)  중  한  영역에  위치시키고자  하면  해당  영역을  할당하고,  나머지  부분은  다시  중앙  영역에  할당하게  됩니다.  다음에  나오는  자바  프로그램은  보더  레이아웃  관리자를  사용하는  예를  보여주고  있습니다.

import  java.awt.*;

class  BorderLayoutTest  extends  Frame  {
      public  BorderLayoutTest()  {
            Window  w1  =  new  Window(this);

            w1.setLayout(new  BorderLayout(10,  5));
            w1.add("East",  new  Button("W1-East"));
            w1.add("West",  new  Button("W1-West"));
            w1.add("North",  new  Button("W1-North"));
            w1.add("Center",  new  Button("W1-Center"));
            w1.add("South",  new  Button("W1-South"));
            w1.setLocation(100,100);
            w1.setSize(200,100);
            w1.show();  

            Window  w2  =  new  Window(this);  

            w2.add("East",  new  Button("W2-East"));
            w2.add("West",  new  Button("W2-West"));
            w2.add("North",  new  Button("W2-North"));
            w2.add("South",  new  Button("W2-South"));
            w2.setLocation(310,100);
            w2.setSize(200,100);
            w2.show();  

            Window  w3  =  new  Window(this);  

            w3.add("Center",  new  Button("W3-Center"));
            w3.setLocation(100,210);
            w3.setSize(200,100);
            w3.show();  

            Window  w4  =  new  Window(this);

            BorderLayout  b  =  new  BorderLayout(8,  16);
            w4.setLayout(b);
            w4.add("East",  new  Button("W4-East"));
            w4.add("West",  new  Button("W4-West"));
            w4.add(new  Button("W4-Center"));
            w4.setLocation(310,210);
            w4.setSize(200,100);
            w4.show();

      }

      public  static  void  main(String  args[])  {
            BorderLayoutTest  f  =  new  BorderLayoutTest();

            f.pack();
            f.setTitle("BorderLayout");
            f.setVisible(true);
      }
}  

/*
  *  Results:
  D:\AIIT\JAVA\Working\08>java  BorderLayoutTest
  D:\AIIT\JAVA\Working\08>
  */

<프로그램  17.  BorderLayoutTest.java>

BorderLayout  클래스의  객체  생성자와  주요  메소드를  살펴보면  다음과  같습니다.

l                          BorderLayout():  컴포넌트들  간의  수평  간격과  수직  간격이  0인  보더  레이아웃  관리자를  생성합니다.
l                          BorderLayout(int  hgap,  int  vgap):  컴포넌트들  간의  수평  간격(hgap)과  수직  간격(vgap)을  갖는  보더  레이아웃  관리자를  생성합니다.
l                          int  getHgap():  컴포넌트들  간의  수평  간격(hgap)을  얻습니다.
l                          int  getVgap():  컴포넌트들  간의  수직  간격(vgap)을  얻습니다.
l                          void  setHgap(int  hgap):  컴포넌트들  간의  수평  간격(hgap)을  설정합니다.
l                          void  setVgap(int  vgap)::  컴포넌트들  간의  수직  간격(vgap)을  설정합니다.
  
마.  카드  레이아웃  관리자(CardLayout)  

카드  레이아웃  관리자는  여러  장의  카드를  겹쳐  배치하는  식으로  관리하고,  컨테이너가  포함하고  있는  컴포넌트들을  한  장의  카드처럼  다루어.  한  번에  한  장씩  사용자가  보기를  원하는  카드를  보여주고,  여러  컴포넌트가  카드  레이아웃  관리자에  등록이  될  경우  가장  처음  등록된  컴포넌트를  디폴트로  보여줍니다.

이러한  레이아웃은  일반적으로  사용자  옵션을  입력받기  위해  윈도우에서  많이  사용하는  하는  레이아웃입니다.  옵션  메뉴를  분류하여  여러  장(카드로  비유됨)을  준비하여  두고,  사용자가  보기를  원하는  카드(윈도우에서는  탭이라  함)를  보여주기  위해  카드  레이아웃  관리자를  사용합니다.  이  때  각  장의  메뉴는  하나의  패널을  이용하여  관리하는  것이  효율적입니다.  다음에  나오는  자바  프로그램은  카드  레이아웃  관리자의  사용을  보여주는  간단한  프로그램입니다.

import  java.io.*;
import  java.awt.*;

class  CardLayoutTest  extends  Frame  {
      CardLayout  c=null;

      public  CardLayoutTest()  {
            c  =  new  CardLayout();

            setLayout(c);  
            Panel  p1  =  new  Panel();
            p1.setLayout(new  BorderLayout());
            p1.add("East",  new  Button("East"));
            p1.add("West",  new  Button("West"));
            p1.add("North",  new  Button("North"));
            p1.add("Center",  new  Button("Center"));
            p1.add("South",  new  Button("South"));  

            Panel  p2  =  new  Panel();
            p2.add(new  Button("Button  1"));
            p2.add(new  Button("Button  2"));
            p2.add(new  Button("Button  3"));
            p2.add(new  Button("Button  4"));

            Panel  p3  =  new  Panel();
            p3.setLayout(new  GridLayout(4,  1));
            p3.add(new  Button("Button  p3-1"));
            p3.add(new  Button("Button  p3-2"));
            p3.add(new  Button("Button  p3-3"));
            p3.add(new  Button("Button  p3-4"));  

            add(p1,  "BorderLayout");
            add(p2,  "DefaultLayout");
            add(p3,  "GridLayout");
            add(new  Button("Button"),  "Button");  

            Choice  colorChooser  =  new  Choice();
            colorChooser.add("Green");
            colorChooser.add("Red");
            colorChooser.add("Blue");
            add(colorChooser,  "Colors");
      }

  

      public  static  void  main(String  args[])  {
            CardLayoutTest  f  =  new  CardLayoutTest();
            int  ch;
            f.pack();
            f.setTitle("CardLayout");
            f.setVisible(true);

            try  {
                  while((ch=System.in.read())  !=  -1)  {
                        if(f.c  !=  null)  {
                              f.c.next(f);
                        }
                  }
            }  catch(IOException  e)  {
            }
      }
}

  /*

  *  Results:  

  D:\AIIT\JAVA\Working\08>java  CardLayoutTest      
  D:\AIIT\JAVA\Working\08>  

  */

  

<프로그램  18.  CardLayoutTest.java>

  

위의  자바  프로그램에서는  다섯  개의  컴포넌트를  프레임에  추가하여,  이를  카드  레이아웃  관리자를  이용하여  관리하고  있습니다.  이  때,  다섯  장의  카드를  가지고  있다고  볼  수  있습니다.  그리고,  위의  프로그램에서는  아직  이벤트  처리에  대해서  살펴보지  않았기  때문에  간단하게  리턴키를  치면  다음  카드로  바꾸도록  하고  있는데,  MS  플랫폼에서는  리턴키가  '\n'와  '\r'  등  두  문자로  구성되기  때문에  두  개의  키가  쳐진  것처럼  카드가  두  장씩  넘어가데  됩니다.  그렇기  때문에  위와  같이  리턴키를  입력받아  카드  레이아웃  관리자를  테스트하고자  한다면,  카드는  두  장씩  넘어가기  때문에  홀수  장을  만들어야  합니다.

CardLayout  클래스의  객체  생성자와  주요  메소드를  살펴보면  다음과  같습니다.

  

l                          CardLayout():  컴포넌트들  간의  수평  간격과  수직  간격이  0인  카드  레이아웃  관리자를  생성합니다.

l                          CardLayout(int  hgap,  int  vgap):  컴포넌트들  간의  수평  간격이  hgap이고,  수직  간격이  vgap인  카드  레이아웃  관리자를  생성합니다.

l                          void  addLayoutComponent(Component  comp,  Object  constraints):  주어진  컴포넌트를  카드  레이아웃  관리자의  내부  이름  테이블에  삽입합니다.

l                          void  addLayoutComponent(String  name,  Component  comp):  addLayoutComponent(Component,  Object)  메소드로  바뀌었습니다.

l                          void  first(Container  parent):  주어진  컨테이너에  포함된  첫  번째  카드를  보여줍니다.

l                          void  last(Container  parent):  주어진  컨테이너에  포함된  마지막  번째  카드를  보여줍니다.

l                          void  next(Container  parent):  주어진  컨테이너에  포함된  다음  카드를  보여줍니다.

l                          void  previous(Container  parent):  주어진  컨테이너에  포함된  이전  카드를  보여줍니다.

l                          void  show(Container  parent,  String  name):  주어진  컨테이너에  포함된  컴포넌트  중  주어진  이름을  가진  컴포넌트로  전환합니다(보여줍니다).

l                          void  removeLayoutComponent(Component  comp):  주어진  컴포넌트를  제거합니다.

l                          void  layoutContainer(Container  parent):  이  카드  레이아웃  관리자를  이용하여  주어진  컨테이너에  포함된  컴포넌트들을  레이아웃  합니다.

l                          int  getHgap():  컴포넌트들  간의  수평  간격(hgap)을  얻습니다.

l                          int  getVgap():  컴포넌트들  간의  수직  간격(vgap)을  얻습니다.

l                          void  setHgap(int  hgap):  컴포넌트들  간의  수평  간격(hgap)을  설정합니다.

l                          void  setVgap(int  vgap)::  컴포넌트들  간의  수직  간격(vgap)을  설정합니다.

  
바.  그리드백  레이아웃  관리자(GridBagLayout)

  

그리드백  레이아웃  관리자는  AWT에서  제공해  주는  레이아웃  관리자  중에서  가장  복잡하고  다양한  형태를  가질  수  있는  레이아웃  관리자입니다.  그리드백  레이아웃  관리자는  HTML  페이지를  생성하기  위해  사용하는  테이블과  같은  방식으로  레이아웃을  수행합니다.  다시  말해서,  레이아웃  영역을  기본적으로  셀  단위로  나누어  놓고,  행과  열에  대해  셀  크기를  확장할  수  있도록  하는  것입니다.  그리드  레이아웃  관리자는  모든  컴포넌트가  같은  크기의  셀에  위치되고  크기  변경이  불가능하지만,  그리드백  레이아웃  관리자는  셀  단위의  레이아웃을  행하기는  하지만  각  컴포넌트가  서로  다른  크기를  가질  수  있도록  할  수  있습니다.

다음에  나오는  자바  프로그램은  그리드백  레이아웃  관리자의  사용을  보여주는  간단한  프로그램입니다.

  

  

import  java.awt.*;

  

public  class  GridBagLayoutTest  extends  Frame  {

      TextField  smtpServer,  mailFrom,  rcptTo,  subject;

      TextArea  body;

      GridBagLayout  gbl;

      GridBagConstraints  gbc;

  

      public  GridBagLayoutTest()  {

            smtpServer  =  new  TextField(40);

            mailFrom    =  new  TextField(40);

            rcptTo          =  new  TextField(40);

            subject        =  new  TextField(40);

            body            =  new  TextArea(5,  40);

  

            gbl  =  new  GridBagLayout();

            gbc  =  new  GridBagConstraints();

  

            setLayout(gbl);

  

            gbc.fill  =  GridBagConstraints.BOTH;

  

            gbc.weightx  =  1.0;

            gbc.weighty  =  1.0;

  

            add(new  Label("메일서버:  ",  Label.RIGHT),  0,  0,  1,  1);

            add(smtpServer,  1,  0,  3,  1);

            add(new  Label("From:  ",  Label.RIGHT),  0,  1,  1,  1);

            add(  mailFrom,  1,  1,  3,  1);

            add(new  Label("To:  ",  Label.RIGHT),  0,  2,  1,  1);

            add(rcptTo,  1,  2,  3,  1);

            add(new  Label("제  목:  ",  Label.RIGHT),  0,  3,  1,  1);

            add(subject,  1,  3,  3,  1);

            add(new  Label("내  용:  ",  Label.RIGHT),  0,  4,  1,  1);

            add(body,  1,  4,  1,  1);

  

            add(new  Button("Send"),  0,  5,  2,  1);

  

            pack();    //  setSize(400,  300);

      }

  

      private  void  add(Component  c,  int  x,  int  y,  int  w,  int  h)  {

            gbc.gridx  =  x;

            gbc.gridy  =  y;

            gbc.gridwidth    =  w;

            gbc.gridheight  =  h;

            gbl.setConstraints(c,  gbc);

  

            add(c);

      }

  

      public  static  void  main(String  args[])  {

            GridBagLayoutTest  f  =  new  GridBagLayoutTest();

  

            f.setTitle("GridBagLayout");

            f.setVisible(true);

      }

}

  

/*

  *  Results:

  

  D:\AIIT\JAVA\Working\08>java  GridBagLayoutTest

  

  

  

  D:\AIIT\JAVA\Working\08>

  

  */

  

<프로그램  19.  GridBagLayoutTest.java>

  

그리드백  레이아웃  관리자가  컴포넌트들에  대한  레이아웃을  행할  때,  각  컴포넌트가  차지하는  셀의  위치,  수평  크기,  수직  크기  등을  설정해  주어야  하는데,  이를  위해  자바에서는  GridBagConstraints  클래스를  제공해  줍니다.  먼저,  GridBagConstraints  클래스가  제공해주는  기능을  살펴보도록  하겠습니다.

  

l                          GridBagConstraints.gridx,  GridBagConstraints.gridy:  컴포넌트가  위치할  셀의  x  값과  y  값을  나타내며,  가장  왼쪽  위  셀의  gridx과  gridy  값은  0입니다.  컴포넌트를  순서대로  위치시키고자  할  때는  GridBagConstraints.RELATIVE를  사용합니다.

l                          GridBagConstraints.gridwidth,  GridBagConstraints.gridheight:  컴포넌트가  차지할  너비와  높이를  나타내는  셀의  개수이며,  디폴트  값은  1입니다.  gridwidth를  GridBagConstraints.REMAINDER  값으로  설정하면  현재  행의  마지막  셀이되고,  gridheight  를  GridBagConstraints.REMAINDER  값으로  설정하면  현재  열의  마지막  셀이됩니다.  gridwidth를  GridBagConstraints.  RELATIVE  값으로  설정하면  현재  행의  다음  셀부터  마지막  셀까지  차지하고,  gridheight  를  GridBagConstraints.  RELATIVE  값으로  설정하면  현재  열의  다음  셀부터  마지막  셀까지  차지하도록  합니다.

l                          GridBagConstraints.fill:  컴포넌트의  디스플레이  영역이  컴포넌트가  요청한  크기보다  클  때,  크기설정을  다시  할  것인가를  결정합니다.  GridBagConstraints  클래스는  다음과  같은  값을  가능한  값으로  제공해  주고  있습니다.

l                          GridBagConstraints.NONE:  디폴트  값

l                          GridBagConstraints.HORIZONTAL:  수평적으로  확장하고  수직적으로는  확장하지  않습니다.

l                          GridBagConstraints.  VERTICAL:  수직적으로  확장하고  수평적으로는  확장하지  않습니다.

l                          GridBagConstraints.BOTH:  수평  및  수직으로  확장합니다.

l                          GridBagConstraints.ipadx,  GridBagConstraints.ipady:  컴포넌트  너비의  최소값에  (ipadx  *  2)  픽셀을  더하고,  컴포넌트  높이의  최소값에  (ipady  *  2)  픽셀을  더합니다.

l                          GridBagConstraints.insets:  컴포넌트와  디스플레이  영역의  엣지  사이의  공간의  크기를  나타내고,  다음과  같은  값을  GridBagConstraints  클래스에서  제공해  줍니다.

l                          GridBagConstraints.anchor:  컴포넌트가  디스플레이  영역보다  작을  때,  컴포넌트가  위치할  위치를  나타냅니다.  이  값으로는  GridBagConstraints.CENTER(디폴트  값),  GridBagConstraints.NORTH,  GridBagConstraints.NORTHEAST,  GridBagConstraints.EAST,  GridBagConstraints.SOUTHEAST,  GridBagConstraints.SOUTH,  GridBagConstraints.SOUTHWEST,  GridBagConstraints.WEST,  and  GridBagConstraints.NORTHWEST.  등이  있습니다.

l                          GridBagConstraints.weightx,  GridBagConstraints.weighty:  컴포넌트의  디스플레이  영역이  컴포넌트가  요청한  크기보다  클  때  남는  영역을  각  컴포넌트들에게  배분해  주어야  하는데,  이  때  컴포넌트가  차지할  너비(weightx)와  높이(weighty)에  대한  웨이트(weight)를  나타냅니다.  이  너비와  높이에  대한  웨이트는  각  컴포넌트마다  달리  줄  수  있습니다.  만약,  모든  컴포넌트의  너비와  높이에  대한  웨이트가  0이면,  디스플레이  영역이  커지더라도(사용자가  윈도우의  창을  키울  때)  각  컴포넌트에  배당되는  영역이  없으므로  모든  컴포넌트들은  한군데  위치하게  되고  남는  영역은  그냥  빈공간으로  나타나게  됩니다.

  

다음에  나오는  자바  프로그램은  GridBagConstraints  객체의  값을  적당하게  설정하여  각  컴포넌트를  컨테이너에  등록한  후,  그리드백  레이아웃  관리자를  이용하여  보여주는  프로그램입니다.

  

  

import  java.awt.*;

  

class  GridBagLayoutTest2  extends  Frame  {

      public  GridBagLayoutTest2()  {

            GridBagLayout  gridbag  =  new  GridBagLayout();

            GridBagConstraints  c  =  new  GridBagConstraints();

  

            setLayout(gridbag);

  

            c.ipadx  =  8;

            c.ipadx  =  8;

  

            c.fill  =  GridBagConstraints.BOTH;

            c.weightx  =  1.0;  c.weighty  =  1.0;

            makebutton("Button1",  gridbag,  c);

            makebutton("Button2",  gridbag,  c);

            makebutton("Button3",  gridbag,  c);

  

            c.gridwidth  =  GridBagConstraints.REMAINDER;  //end  row

            c.weightx  =  0.5;  c.weighty  =  0.5;

            makebutton("Button4",  gridbag,  c);

  

            c.fill  =  GridBagConstraints.BOTH;

            c.weightx  =  0.0;  c.weighty  =  0.0;  //reset  to  the  default

            makebutton("Button5",  gridbag,  c);  //another  row

  

            c.gridwidth  =  GridBagConstraints.RELATIVE;  //next-to-last  in  row

            makebutton("Button6",  gridbag,  c);

  

            c.gridwidth  =  GridBagConstraints.REMAINDER;  //end  row

            c.weightx  =  0.75;  c.weighty  =  0.75;

            makebutton("Button7",  gridbag,  c);

  

            c.gridwidth  =  1;                                    //reset  to  the  default

            c.gridheight  =  2;

            c.weightx  =  0.25;  c.weighty  =  0.25;

            makebutton("Button8",  gridbag,  c);

  

            c.weighty  =  0.0;                                    //reset  to  the  default

            c.gridwidth  =  GridBagConstraints.REMAINDER;  //end  row

            c.gridheight  =  1;                                    //reset  to  the  default

            makebutton("Button9",  gridbag,  c);

            makebutton("Button10",  gridbag,  c);

  

            setSize(300,  100);

      }

  

      protected  void  makebutton(String  name,

                                                          GridBagLayout  gridbag,

                                                          GridBagConstraints  c)  {

            Button  button  =  new  Button(name);

            gridbag.setConstraints(button,  c);

            add(button);

      }

      public  static  void  main(String  args[])  {

            GridBagLayoutTest2  f  =  new  GridBagLayoutTest2();

  

            f.pack();

            f.setTitle("GridBagLayout2");

            f.setVisible(true);

      }

}

  

/*

  *  Results:

  

  D:\AIIT\JAVA\Working\08>java  GridBagLayoutTest2

  

  

  

  D:\AIIT\JAVA\Working\08>

  

  */

  

<프로그램  20.  GridBagLayoutTest2.java>

  

위의  자바  프로그램을  실행한  후,  윈도우의  크기를  적당하게  조절해  보면,  주어진  웨이트에  따라  남는  영역이  배분되므로  각  컴포넌트의  크기가  웨이트에  따라  변하게  됨을  알  수  있습니다.  그리고,  GridBagConstraints.REMAINDER와  GridBagConstraints.  RELATIVE의  차이점도  볼  수  있습니다.

GridBagLayout  클래스의  객체  생성자와  주요  메소드를  살펴보면  다음과  같습니다.

  

l                          GridBagLayout():  그리드백  레이아웃  관리자를  생성합니다.

l                          void  addLayoutComponent(Component  comp,  Object  constraints):  주어진  컴포넌트를  주어진  constraints  객체를  이용하여  추가합니다.

l                          void  addLayoutComponent(String  name,  Component  comp):  주어진  이름으로  컴포넌트를  추가합니다.

l                          GridBagConstraints  getConstraints(Component  comp):  주어진  컴포넌트에  연결된  GridBagConstraints  객체를  얻습니다.

l                          Point  getLayoutOrigin():  레이아웃  그리드의  시작  위치값을  얻스비다.

l                          double[][]  getLayoutWeights():  레이아웃  그리드의  행과  열이  갖는  웨이트  배열을  얻습니다.

l                          void  invalidateLayout(Container  target):  레이아웃을  무효화(invalidate)  합니다.

l                          void  layoutContainer(Container  parent):  이  그리드백  레이아웃  관리자를  이용하여  주어진  컨테이너를  레이아웃  합니다.

l                          void  removeLayoutComponent(Component  comp):  주어진  컴포넌트를  제거합니다.

l                          void  setConstraints(Component  comp,  GridBagConstraints  constraints):  주어진  컴포넌트를  위한  constraints를  설정합니다.

  
사.  레이아웃  관리자를  사용하지  않는  레이아웃(Absolute  Positioning)

  

지금까지  여러  가지  형태의  레이아웃  관리자에  대하여  살펴보았습니다.  이러한  레이아웃  관리자는  시스템(플랫폼)에  독립적으로  컴포넌트들을  컨테이너에  레이아웃  할  수  있도록  해  주었습니다.  여기에서는  사용자가  원하는  위치에  직접  컴포넌트를  위치하도록  하는  방법에  대하여  살펴보도록  하겠습니다.  이러한  방법은  GUI  툴을  이용하여  컴포넌트들에  대한  레이아웃을  행할  때  사용될  수  있는  방법입니다.  그러나,  이러한  방법은  시스템의  폰트가  바뀐다거나  자바  프로그램을  실행하는  플랫폼이  바뀐다거나  할  때,  컴포넌트의  레이아웃이  처음에  의도한  것과는  다르게  나타날  수  있으므로  주의하여야  합니다.

다음에  나오는  자바  프로그램은  레이아웃  관리자를  사용하지  않고,  컴포넌트의  위치를  직접  설정해  주는  방법을  보여주는  프로그램입니다.

  

  

import  java.awt.*;

  

public  class  NoLayoutTest  extends  Frame  {

      Button  b1,  b2,  b3;

  

      public  NoLayoutTest()  {

            Insets  insets;

  

            setLayout(null);

  

            setSize(200,  100);

//            setVisible(true);              //  (a)

  

            b1  =  new  Button("one");

            b2  =  new  Button("two");

            b3  =  new  Button("three");

  

            insets  =  getInsets();

            b1.setBounds(50  +  insets.left,  5  +  insets.top,  50,  20);

            b2.setLocation(new  Point(70  +  insets.left,  35  +  insets.top));

            b2.setSize(new  Dimension(50,  20));

            b3.setLocation(130  +  insets.left,  15  +  insets.top);

            b3.setSize(50,  30);

  

            add(b1);

            add(b2);

            add(b3);

      }

  

      public  static  void  main(String  args[])  {

            NoLayoutTest  f  =  new  NoLayoutTest();

  

            f.setTitle("NoLayout");

            f.setVisible(true);              //  (b)

      }

}

  

/*

  *  Results:

  

  (a)  부분을  주석처리한  후  실행

  D:\AIIT\JAVA\Working\08>java  NoLayoutTest

  

  

  

  

  (b)  부분을  주석처리한  후  실행

  D:\AIIT\JAVA\Working\08>java  NoLayoutTest

  

  

  

  D:\AIIT\JAVA\Working\08>

  

  */

  

<프로그램  21.  NoLayoutTest.java>

  

위의  자바  프로그램을  살펴보면,  레이아웃  관리자를  사용하지  않고,  자바  프로그램  개발자가  임의대로  레이아웃을  하려  할  때  주의해야  할  점  중  하나를  보여주고  있습니다.  자바에서  테두리를  구하기  위해서는  먼저  컴포넌트가  보이는(visible)  상태여야  합니다.  그렇지  않을  경우,  테두리(inset)의  값은  모두  0이  됩니다.  그러한  이유로,  위와  같은  결과가  발생하는  것입니다.

레이아웃  관리자를  사용하지  않고  컴포넌트의  위치를  직접  설정할  수  있도록  하기  위해,  Component  클래스가  제공해  주는  주요  메소드를  살펴보면  다음과  같습니다.

  

l                          void  setLocation(int  x,  int  y):  컴포넌트를  새로운  위치로  옮깁니다.

l                          void  setLocation(Point  p):  컴포넌트를  새로운  위치로  옮깁니다.

l                          Dimension  size():  getSize()  메소드로  바뀌었습니다.

l                          void  setSize(Dimension  d):  컴포넌트의  너비와  높이를  각각  d.width와  d.height로  설정합니다.

l                          void  setSize(int  width,  int  height):  컴포넌트의  너비와  높이를  각각  width와  height로  설정합니다.

l                          void  reshape(int  x,  int  y,  int  width,  int  height):  setBounds(int,  int,  int,  int)  메소드로  바뀌었습니다.

l                          void  resize(Dimension  d):  setSize(Dimension)  메소드로  바뀌었습니다.

l                          void  resize(int  width,  int  height):  setSize(int,  int)  메소드로  바뀌었습니다.

l                          void  setBounds(int  x,  int  y,  int  width,  int  height):  컴포넌트를  주어진  위치로  옮기고  크기를  변경합니다.

l                          void  setBounds(Rectangle  r):  컴포넌트를  주어진  위치로  옮기고  크기를  변경합니다.

[출처]  제8장  AWT  -  4.  컨테이너와  레이아웃  관리자(Layout  Manager)|작성자  뮤지션
http://blog.naver.com/leiphie?Redirect=Log&logNo=17618180
[본문링크] 4. 컨테이너와 레이아웃 관리자(Layout Manager)
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=2572
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.